{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.5. 图像分类数据集（Fashion-MNIST）¶\n",
    "在介绍softmax回归的实现前我们先引入一个多类图像分类数据集。它将在后面的章节中被多次使用，以方便我们观察比较算法之间在模型精度和计算效率上的区别。图像分类数据集中最常用的是手写数字识别数据集MNIST [1]。但大部分模型在MNIST上的分类精度都超过了95%。为了更直观地观察算法之间的差异，我们将使用一个图像内容更加复杂的数据集Fashion-MNIST [2]。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.5.1. 获取数据集\n",
    "首先导入本节需要的包或模块。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "import numpy as np\n",
    "import time\n",
    "import sys\n",
    "import matplotlib.pyplot as plt\n",
    "import d2lzh as d2l"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面，我们通过keras的dataset包来下载这个数据集。第一次调用时会自动从网上获取数据。我们通过参数train来指定获取训练数据集或测试数据集（testing data set）。测试数据集也叫测试集（testing set），只用来评价模型的表现，并不用来训练模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "from tensorflow.keras.datasets import fashion_mnist\n",
    "(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练集中和测试集中的每个类别的图像数分别为6,000和1,000。因为有10个类别，所以训练集和测试集的样本数分别为60,000和10,000。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 10000)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(x_train),len(x_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以通过方括号[]来访问任意一个样本，下面获取第一个样本的图像和标签。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "feature,label=x_train[0],y_train[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "变量feature对应高和宽均为28像素的图像。每个像素的数值为0到255之间8位无符号整数（uint8）。它使用三维的NDArray存储。其中的最后一维是通道数。因为数据集中是灰度图像，所以通道数为1。为了表述简洁，我们将高和宽分别为 h 和 w 像素的图像的形状记为 h×w 或（h，w）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((28, 28), dtype('uint8'))"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature.shape, feature.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "图像的标签使用NumPy的标量表示。注意，在keras的fashion_mnist数据和原书mxnet提供的数据集有差别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9, numpy.uint8, dtype('uint8'))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label, type(label), label.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fashion-MNIST中一共包括了10个类别，分别为t-shirt（T恤）、trouser（裤子）、pullover（套衫）、dress（连衣裙）、coat（外套）、sandal（凉鞋）、shirt（衬衫）、sneaker（运动鞋）、bag（包）和ankle boot（短靴）。以下函数可以将数值标签转成相应的文本标签。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "def get_fashion_mnist_labels(labels):\n",
    "    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',\n",
    "                   'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']\n",
    "    return [text_labels[int(i)] for i in labels]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面定义一个可以在一行里画出多张图像和对应标签的函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "def show_fashion_mnist(images, labels):\n",
    "    _, figs = plt.subplots(1, len(images), figsize=(12, 12))\n",
    "    for f, img, lbl in zip(figs, images, labels):\n",
    "        f.imshow(img.reshape((28, 28)))\n",
    "        f.set_title(lbl)\n",
    "        f.axes.get_xaxis().set_visible(False)\n",
    "        f.axes.get_yaxis().set_visible(False)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在，我们看一下训练数据集中前9个样本的图像内容和文本标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArIAAABaCAYAAABE8bVGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztfXl4nUXZ/j1nz8napGnadKUbUEDWUmRfLYuKCAiiH4uo\nwOfnLoI7n6L+5BPcQBAREBVcwBVRELCsAqVl60L3tOmStmmaPTnr+/vjfp6zvDknOUlOmgTmvq5c\nJ+8+M+/MvDP33M/zGMdxYGFhYWFhYWFhYTHe4BntBFhYWFhYWFhYWFgMBXYga2FhYWFhYWFhMS5h\nB7IWFhYWFhYWFhbjEnYga2FhYWFhYWFhMS5hB7IWFhYWFhYWFhbjEnYga2FhYWFhYWFhMS4xogNZ\nY8wSY8xHB3tsgHvOMsY4xhjf8FM49mGMudwY82w/x/9hjLlsX6ZpNPF2LA9jzL3GmBtHOx3jBW/3\nOmKMOdkYs3W00zReId+XuaOdjmLC1o/iYjDjkLdDeY92eVhGNgMj2YEZYxqMMacX+76O45zlOM4v\n+3luvx/10YItD4uBYOuIhYWFhcVAsAPZtzDeLqx1oXirlcdbLT9jAbZMhwZbbn1hjPGOdhrGCmz9\nsBhJDDiQNcZcb4zZYIzpMMasMsacl3HscmPMs8aY7xtj9hpjNhljzspznynGmNeNMdfmOf4RY8xq\nuc+jxpiZAyTtI8aY7caYHcaYL2TcJ2iM+aEc2y7/BzOOf8wYs94Y02KM+asxpl72Py2nvGaM6TTG\nXDRQ2RQKY8yvAMwA8De59xdznHO5MWajlPMmY8yHXMdzlnGmREPu8Zwx5gfGmD0AfgfgDgDvlOe2\nFitPw4Etj/5hjDncGLNc8v47ACHZf7IxZqsx5jpjTBOAe2T/u40xrxpjWo0xzxtj3pFxr+uMMdvk\nXmuMMafJ/qONMS8bY9qNMTuNMbeMRl7z4e1aRwxZ6C9JX7vXGHOPMSZkcrDEpsAVJGPMgZLnVmPM\nSmPMe2X/ImNMk8kYcBljzjPGvC7/e0y6/99jjPm9MaZajulS4pXGmC0AnixqQWSnv08dNsbcIOm5\nT/avNMYclXFNvTHmIWPMbnn/n8o4drQx5j9SHjuMMbcaYwJ5nn28MabRGHOybB9gjPmX4fdjjTHm\nAxnn3muMud0Y84gxpgvAKSNQFrZ+FIA8dabf9y7pvdoYs07Ouc0YY+SYV/qTZmPMRgDnuJ53heH4\npcOwT7pqX+Z3ILzly8NxnH7/AFwIoB4c9F4EoAvAFDl2OYAYgI8B8AK4BsB2AEaOLwHwUQD7AVgL\n4OMZ910C4KPy/7kA1gM4EIAPwFcBPJ8nPbMAOAAeAFAK4BAAuwGcLse/CeAFAJMA1AJ4HsC35Nip\nAJoBHAEgCOAnAJ7OuLcDYO5AZTKUPwANmsYcx0oBtAPYX7anADhoMGWccW4cwCelHEtk37MjkSdb\nHiNSLgEAmwF8FoAfwAWS3xsBnCz5+Z7U3xIAhwPYBWCRlMdlUrZBAPsDaARQn9F25sj//wHwX/J/\nGYBjRjvvto6k8rwCwHQA1QCek3ffJ03I6K8A3AvgRvn/ZABb5X8/2Ld+WerWqQA6MsptA4AzMu75\nBwDXy/+fBvvSaVKffgbggYy65AC4T95FyQiVR846DOAGAL0AzpZ3/F0AL8g5HgDLAHxd8jwbwEYA\ni+X4kQCOkfc9C8BqAJ9xlyuAM+XZR2fUuUYAV8i1h4PfkwUZ76ANwHGShpCtHyNbPwZZZwp57w8D\nqAIn0bsBnCnHrgbwZka5/1vO98nxc+QZBsBJALoBHOEu79H4ezuUx1AK5VUA58r/lwNYn3EsLJmZ\nLNtLANwCNr4Puu6zBOmPyT8AXJlxzCMZn5nj+dpADsjYdxOAX2Q0vLMzji0G0CD//wLATRnHysAP\n3qyMFzdaA9lWAOfD1eALLOPMj/KWHNePuYGbLY+85XIiMgZdsu95pAeyUWR8IAHcDpmoZexbA3Ye\nc8FB7ukA/K5zngbwvwAmjnaebR3pk+erM7bPBvu0PmlCYQOVEwA0AfBkXPcAgBvk/xsB3C3/l4NE\nxUzZXg3gtIzrpoD9pX74HACzR7g8ctZhcCD7eMb2AgA98v+iHO/0SwDuyfOMzwD4k6tcvwROKA/O\n2H8RgGdc1/4MwDcy3sF9tn7su/oxmDpT4Hs/PmP790gP2p90lfu7kDFwy3HvPwP4tLu8R+Pv7VAe\nhUgLLjXpZctWAAcDmJhxSpP+4zhOt/xblnH8QwC2AXiwn8fMBPCjjGe0gCP5qf1c05jx/2aQNYb8\nbi7kmOM4nQD2DPCcosMYc4fhsmWnMebLjuN0gZ3k1QB2GGP+bow5IOOSgco4E4159o9Z2PLIQj2A\nbY60eEFmfd7tOE5vxvZMAJ/XtiPtZzo4+14Pdk43ANhljPmtESkNgCsBzAfwpjFmqTHm3SOVoWLg\nbVZH8vVtQ0E9gEbHcZKue2qfdz+A9xvKr94PYLnjOFrfZgL4U0a9Wg0gAaAuT1qLjgHqcFPGqd0A\nQoZazJkA6l1t4suabmPMfGPMw7Js3g7gO8j+pkGe+XvHcVZk7JsJYJHrvh8CMDnjnH1Rl2z96Af5\n6kyB791dp7TPqEffck/BGHOWMeYFQ8lJKzjBcN97VPB2KI9+B7KGOtWfA/gfADWO41SByxpmEM+4\nAVx+ud/kF783ArjKcZyqjL8Sx3Ge7+e+0zP+nwGyWJDfmYUcM8aUAqgBB9ojjdTAxHGcqx3HKZO/\n78i+Rx3HOQOc1b4JlvuwnpNne6zAlkdu7AAwVbVIghkZ/7vT3wjg2662E3Yc5wEAcBznfsdxjgfr\nvQPKEuA4zjrHcT4ISnC+B+BBaQ9jCW/XOpKrb+sCmWUAgDFmsvuiPNgOYLoxJrOvnwHp8xzHWQV+\nhM4CcAk4cFE0AjjLVbdCjuNk9pcjXlb56nA/aASwyZXucsdxzpbjt4P1ZZ7jOBXgINf9TbsQwPuM\nMZ923fcp133LHMe5JjO5Q8zmYGDrxwDIU2cKee/5sAN9yx0A7XIAPATg+wDqZJz0yCDuPeJ4q5fH\nQIxsKZjp3ZLAK0BGdjCIgZ1CKYD7XA1GcQeALxljDpLnVBpjLhzgvl8zxoTlmitAIw2AyyJfNcbU\nGmMmgjqpX2ccu8IYc5gU9ncAvOg4ToMc3wnqqUYCee9tjKkzxpwrA4kIgE4AyVznDvG500weY4ZR\nhC2P3PgPqNn8lDHGb4x5P4Cj+zn/5wCuNjTMMMaYUmPMOcaYcmPM/saYU6Wu9wLogZSjMebDxpha\nYWLUoKlYZVwsvF3ryCeMMdMMDWe+AvZtrwE4SPquEEgQFIIXQSbli1KfTgbwHgC/zTjnflDveCKo\ngVTcAeDbQmhA+tRzh56twaO/OtwPXgLQYWjgUmJomHKwMWahHC8H9dWdwuJfk+Me2wGcBuDTxhg9\n/jCA+caY/5Ky9BtjFhpjDhxuPgcJWz/6QT91ppD3ng+/B/vkacaYCQCuzzgWADXCuwHEDQ1L31WE\nrBQFb4fy6HcgK7Oxm8GP607QsOq5wT7EcZwouCxRB+Bu92DWcZw/gTOE3wrFvQKcAfaHp0CR+hMA\nvu84zmOy/0YALwN4HcAbAJbLPjiO8ziAr4GzhR2gGPnijHveAOCXslTyARQX3wUH2K0mw8uCwAPg\nc2Dn2QLqGwdTqfrDkwBWAmgyxjQX6Z7FgC2PHMhoK5eDeb8IwB/7Of9l0KjpVgB7wTZxuRwOAvh/\n4IpIE8i+fkmOnQlgpTGmE8CPAFzsOE5PcXMzbLxd68j9AB4DDZQ2gNrGtaAh6+MA1gEoyM+t1Kf3\ngP1pM4CfArjUcZw3M057ACy/Jx3HyczvjwD8FcBjxpgO0LBn0TDyNRT0V4dzwnGcBIB3AzgMwCa5\n9i4AlXLKF0B2sQOcCP4ux23gOM4WcDB7vTHmo47jdIAf5IvBeteEtOHlvoStH/0jX50p6L3nwc8B\nPApOGJYjo0+WevEpcHC3V57x1+Fmooh4y5eHWvFaWFhYWIwyjDENoCHa46OdFouxB1s/LCz6wgZE\nsLCwsLCwsLCwGJewA1kLCwsLCwsLC4txCSstsLCwsLCwsLCwGJewjKyFhYWFhYWFhcW4hB3IWlhY\nWFhYWFhYjEv4BnNywASdEMaaz/TioRddiDqRgp32Fr08SksAAL7pUQBAT2uI292Uf5hkhgxE/o2H\nORcxlXFuR/lKQ9sjPC0eH1aSOrC32XGc2kLOLVZ5mIAfABCppRvP4O4YAMCJRgu/SRnLMl7C8vE1\nS3CnYUpp9mV5mBK+/2gF44j4KlgOsYRstzBv3k4G+kqG016AolX8rS7r4jVJXtPVynLxN3UNOV2Z\nGI36UQyYIOuWExlEnSoAo9leYpXMU6iG9SEq9STWy+NZrum93KgKs120dtOXfqiR1zrJ4rjkHa/1\nY6QwFsojWcV37e1JAACcSCTvudoHxUqlz2kuTr+hGAvlMZYwmPIA3vplUuiYbFAD2RBKscicNvRU\njXG86DwxqPPzlocGZcozaEqcfAQAYMNFLP7/PYUu2Hodfohm+XcDACZ5OwEAhwVDA6blF20M5BJz\n2OF8rJLR456LcLBzzSsfAgBMvYUfNfPcqwPeEwAedx7cPPBZxHDrh3fCBABA40fpX/zKyx8BAOyN\ns6G+0cZIjF2xoPym/dVPLm0HAFT6+SE+Y8JKAMCXnjkfAFD9EvM98c7/DDl9wMiWR/slxwAApl6z\nHgCwN8IPTqmfg632COuB5vWTU+iB57gQ9z/UWZG6V1eSZfNM2/4AgC2dLNvyAMvnpOp1AIAfLD0d\nADDv8mUFpzMT+7J+1DzHPOxfthMAsLJjCgCg8ypGPkysXJP3Wu/c/QAA5/+N73+ynzEg/r73MABA\nwxmsU4nWtiGnDyhSeeTpP3zTGDV09RenAQDeexzf2QQfB6M7o3z/5T6+46ur6Up0P3/f/qMzyXMe\n6Wa8iafbGN23NtDBZ3SyP3n5hfkAgP3/bxMAIN60s9DsAdi39WM8YETKwyMBM5OJrN3e+XMAAGuv\n4rjo0Qu+DwCY4y9x3SBf5OY0Ig4n0d1JXnvsXXTrPON/8wTfzJMmN2z9yMZgygN465dJoWMyKy2w\nsLCwsLCwsLAYlxgUI2tRIFxMindiDQCg5wHOfK+Z+RAAIGA4W22IklHaJYzKii4yL3FhV0s8ZOTm\nlaTZkK3RagBpBjbpZLPv1/dOAgBM9JPVvfagfwEAqu4le/ONle8BAEx+3+ohZXEkkNi7FwAQaGP5\nPfD/GNztnZ9ZCgC4fAqDyp0QYnCZCd5UaHGsjDIoVUOcrN3nlzPCcf2jLJ/owKTDqMFzKBnorg+Q\nDVy2muyhJ0xZiPGwPJwk3/GWOOvTV7ren3WfeDI9L01IfWhpJ5udSPBYMs7fV5bNBQD4p7A+rL2T\n0Tvnf3xpcTI1Agh6WR6LSjcAAM6qeA0AMPkfXBrdGGP7+cizlwMA/n7SralrQ4bs5O4kmddVEbax\nmaE9AIANrWN3eU7rx9kPMA81bWRNN3ay3+iJi7RApARdUbLxD648HAAQLmX5aB0AgKhIkPx+9kEz\nqtn2tvjYfsp8vOa0E1jGuxeyAe385TuZhl8Mb2XDogjIw3oe+xq/F1dO+CUAoNrD+rBDTlvSw3pQ\n66VM4I0IV7pW99an7nFKGb8L9T7Wte3xcgBAnZfM7LKP/RAA8PplTMM1b3DFb9K5b2anqUBmdkxA\nVkKMl2l2Ehlpdq+uGtdq9wCStcjZ7F+Dj7B/NUcdzMuWrSzo+lGHO7/AkNPc9Gf2Z7U/Irvv/fdy\nAIAnzO95srt70Pe0jKyFhYWFhYWFhcW4xNhiZPvRlnpryEDuXUzNVsX9L+S81vjITjixAYw4Bjmj\nGg4q/sJ7X1xDRvHFDmqXlE0tkVluT4Jp9xieHzDxrO3Xu6an7ukz2TNcv8k9490V5Uy6OUZGRZnb\nbx30FwDAbUdTQ4qX3hh8xkYIyQDT6GulwclT9xwNAPB/hHlsSTAv1aIhBoDVvfMAAPe+SZ1p3a84\n22vbT8p4d3GMV0YCa6+lhjHZ7M3ar0xsMMj6EY+L8Y6wqpu3kJHztLMZJ0PpPBphb52AK9+yHz7e\nO9HIWXDtgWQm2z7M8qv8tat9jQGsa6XWL1rDcljeMwsAcFhoCwDghBDby7zLOMO/5cUzUtdeO/kx\nAMAbvWxDpR4yjm90TJUzWkcu4YOFqy/a+12+//+0st/Y1M6+MORjfrVNR4SRNdJfKBMbibB+qCEo\nAPiEiS0PUyurrG4kwXNUj+31sP9Qnfbcj1CH3P5HMre6imKxD6HfLhfLeeAyvrtra14CADzby3dU\n5SXDlXTYJ1Z5uHrVK9+fk0poT3F6eGvqXtulLrWK1r5O+tqd0vfulEeXe1h/Xln4WwDAKf86FwAQ\nOGNzdhoHsBsZk+gvrQPko/u8RQCAPQezHHvnsC2e9HW2Jw8aAADbT+U7GQoLWRTkey/u/fqbOW7K\nc60JctVLjQid42iHcNFd/wQAXFlJ+5xTvsy64v23XDgMA1PLyFpYWFhYWFhYWIxLjClGNqVNEZdR\nnsMWpI6tvoozQZlMwt9Fls7Xw1G8/7GXea2biXXpXmA8Oc8zPh8wPE9VfRA/9UgAwNk1ZD+Xd80C\nAIRF8xqUB04K0Ar9jFLRJYlrHL+ktSMZl+vSjF3EYb51JlIuOqjuJNmbjXG+2n90vIP7E2LhL5Oo\nXocMzNqPknmZ/9LQ81ls+DuZ/+6JzF3FZuZ/6deOAgA8MZ2sYe/E9OywooHlMbmZDEB3rWiHtYYX\n7FRt32PmfUxr2ydZD/bu4azd2cV3010mmYhnzztNVFjXiaxPWVlsF+8Uvbnnqh65NlHB8tq9jf66\n5o9BJlaxbTO1waXzONPXOrwnSX2r1/Rmnf/C9pmp/+dP5zmPikZWvRbUBVnmu0cq0cOAb/YsAMAh\nNTsAAI1dfEdhP9t4RNp4dYhsTm0J24nPsC3EHb77qLCs0WS6/6gKsCOdEqIuO5JkWeqqUEQazs4e\n1kVlaOtC1EyuueRQAMCk2/JYrVuMHFwMWMtHqFu+efJtAIB/9lAr7oew7kbc9sn3RBn8hPQYG+Pi\njivDP5uu8Om+iLC3yszG5MvTLfXmr128x+8OuB8AcO4lnweQsXI6lpjYfCykbPfnsrLp08cCAKY8\ny3az7ZRKAMCHL6MNynMtXDX54rS7AAC/3s3zl6yg95it19E2wfPUK8PKQtGQi2nN2G98riGiN92H\nmADHFMkO9gmqh1YmtudcjtF+/MOfAADaHfa9d7RyFazkv3m+risk+3EDNxAsI2thYWFhYWFhYTEu\nMbYYWRn964yocXFV6tiH3vkMAOC53fR7uDlIP4ci+4HvdM5K5/90GwAg3kDdXL5ZlvoshVgmJtrb\nsx2GFwFbT+WMpcbHWaz6e1RtbMjDmXJzjKzHxT/lLLZ0OxmV8s2coXRO50ymbFt6xuJ4OIPyRHlu\nIij6SXGev+twluU3P/gbAMCyLlrCKxscc3j8B6c8AAC4HXOHmdviwRPXF8E8dk/M1o6Gm5nnsqb0\nC4tJYIiOacyXSoaNnjKGCAE3dDWh+xjO3o9eTMvfl16h7teIntUT5rtLtrA+KKvqNLOeeTP8RidK\npN7Ltb4Olk+sRnSVModVzwj7f4btZSzbFpevJfsTOoPtJimMY2OUTG1biP53k8cfJlekV112JWih\n7RG2stTw2ObuajmjecTSPVTEJ5FZO66SrOeTSfp6rRCPAvVBssrdomOs9knwC+lfNK/Krml5AUBQ\n+h4vknKNL+saZWghrolf7ZgmzxZ95cnCwtw2zExaFAz391Gx9MbbAQDLItw/29cCAFgV5Teyw+F3\np9Ro22c/EZJ6EZA6kOhn2UqPKTOr21pfKkQr+2aMKx//+f4dAIBz/kMdZHwTNbPGL4FIBrJhGQs4\n+pDUv45fvN8cz3q/9nCuUJRXUSN+z5/oj3vqEubrpn9zJTR2Gm16wguZb0+EYwFdbU6+umrk0j8Y\n5GHM+7DTGdt9AmmIHtq7P8cS9//kFgDAxjhX00OyMnDvt+kxqXKdsPVF0E9bRtbCwsLCwsLCwmJc\nYkwxssnebI1b9PC0VfoFlWStlMV8ysOZ4LYnaYWceAfP3XwL2c3kK2S3alZwllDxCnVmzSdSn7H7\nSI7+62RSMOHxDTAtxS2Od5/1IgCgS3R5mnbVtk0UH33reuoAAPU3kXnpuIga0J1Hk26ecjP3b7v+\n2NS9J74huqeJ4qXBy1lNuIkzwpnfoOi19yIeVyZ2ol/8AsbIdl9TRT92dxzJmXPKr90oQtlmIzM0\nj9CEKvHrrSpg/qXkgkzykr4xLJIVzPgm3/P7PkT24rU61tXePawHiW4JE9ktYXc7s/Ok7CsA+LpE\nCy5VOumXsuwU7XAFZ9a1j5FZSDTvKWJORgZlW9nmtT0p01juZb/x7x56NXj4dz8HAGyMxVLX/rOL\nelllBZRJ2tZJjVvFGGRkdx9OdkvTfGwl/edqvv3CsDXHSZs+K/q817aQPfVukRDXXawn3gwCxd8l\n9UGKKBHkOa0H8Z6fPoleHtS39fzSXQCAGQGW0zPhOUXIocVg4GbH4o/PAACsjrLfaIiRgX1fKZn6\nVUJ6KkPvDi4bcAZvJa5MrP6qTl3r6JY4Vzh2JbYDAHacSd+0tbdvljyk2+SoIQ/z561gXW9bTD+n\npdvS4xFfC0uv7l5+N2OfZH+5o4kru/O+Tr/Kvpkcj8TlGaFXGBHPHMXVlC2LyU5qW5xaWIDNkccA\n/n59s1jX4pMqU/sitexfdh4luvpJEvJYbHxeE//4T3cw7/NDTQCAmmdl1bxoibeMrIWFhYWFhYWF\nxTjF2GBkXRqJzg+Qkbx0wZLUKRtiZFumBaj/ubBeYsN/mL+3rjkJANC1kTMGTynv1XQMx+rbzuX1\nTozzgAnLRRN2GaNltUdnI/FEsIiZAr40ibreh0Wfqrq0Cf7smfDsEtpMrwC1fs/c8lOmOUFt00nz\nPwsA2PSen6auOfGN8wAA/zrodwCAsHgt+MbugwAALxzKWVK3sFdabjqDjolV8l8kitiOE1huk5cN\nMbNFRLSM9UGSDm+v6D3V8YQUn5MhnXXcRpee7N9E33DzYwZu3divzmJdxveyz/MKE6v6X9XBentE\nK5tRHnrMI7pZxz1lle2q+8ZPhKayrWRIWpO0kFZWVRmnXcJM/ngvVzjUxyWQZjHX9pK1Ut26x4xd\n8XTt7Xw39z1+CgBg/RXMV/BAWkxP/Y5YCS9VH9DsR+bKrzJMppwskFNakrp3skJY/hL2B74OUkST\nbqNm7x8g83TkKyzj40vXAgC2SeS80+vpT3aZ5UJGDd+d81DWdpVE6vKKdwLt6xWqkU5pYeXHOwgD\nAr1W76Uaa31WlYffrBoP69few2XlR28wBrwXpLTGGrlLLfQn8Bvok+9N86HpyJHtJzDf60/mas+x\nn7saADDvt9leXuKbG7O2nWnSZlvEE08973PWB9i2X3ua3j/M868NK0/DhfFLmURYJhpNMHkLV3Cn\nlbNP2dadZtQ/MfUpAMDjbRxzfLqWDmE/vu4SAMC/2hi9rFJ09S0JrjA5/sKGnYPxJGV7IQsLCwsL\nCwsLi3GJ0WFkc8XtzcAx11HfeUpZX4u+qTJ77HLIYrXKKP8bC/4OANg9nxpZtcK9ax11pZ3C1Hrj\nfPYxH6Eft/OrGfv4pocOgcdxq4iGBo1k8WKE1uduTZ/qiSb7yay80j0z6/qzz78cAODp4XkzpjPN\nZ3/9Xalzyg1nvhdEFnOH6EpbT6eVZDk4U3x6L7dPriaDouyV/u6WGNq97xQ98g8Hnd2iQ3WdKZZV\nCXuPazujGrmPeeLZ+5PZjg/GFNwWvPGNDfzdRE8cgZmsl/Fe8feo2lhhplPaR0+6QMSAHb012Tpj\nnboGt2azNeMB/u20ED6/lL93tJFx1DqszJLqwTPRkZRIVcogiVV+b4yVrWykEj0MrL2DfhiVMJvy\nlDBHrzLf0Qms5Bevpn5V87ahdxIAYFU7WbFtHcxdJJ5uBI7oI4343q0rZ/u/chq1jA/uog/s5R8l\no/RqGzWxznauYI1aJKJCMIBPTDcTBxRgTT+AhjB1H41qFI32eUax0RTnN60qQLYszcCqD1i+444k\n60G5OGF322wouxrNWNLx5vF4kXkOkI6Qt0cifikrvENWE395OhnMb+MwjBXkev8A4HQy7frN6Dwx\nXcfrf8syW3wJ86Hf14EQqeP4JFrBOjlpGdvsI1H27ZNDLL/QVGqJsRWjArcHguRr9Gnvu5Tpatgm\nDvzRkzrnNsyX/1iP/hvHAwBu2vQgAKDWyzbw/V1cUXrgkRMBAPutJxvtbo8pn7WZvv4LbD6WkbWw\nsLCwsLCwsBiXGB1GdoBZ6rpOMgp7KtI8SVOcmq0aiSyis8tZflrR7k4IKyP6U505/u9BfwMA9B7I\n2arOMI8N0arywlWXAgBKsXHI2XFj57Wc3Uz2MmpQgyiE1DdjnTCxqunTqFvx044AAPTUSpSdaonE\nIhPtrslpS2G1NlY9TyIgfv6qxJr0as74ji2jjmVXTKyPQ/TeoOxVpcygLzuQHhaeQlpHN1rQGbGv\nO1sbm9K9qsQrFzniqlreoQcLGXU4HnlHZazre0QbmghK5LcO0atJ/fBk5NVNSrrLqmTX2Pfi4Ib6\nolSkvBaIFtbvymQiY54eFr+xQY9GyWNhtbaRMZk4AukdLqY+zne0nYQGms9lPbjpKGojP//3DwMA\n7vsq/TJGKpnfdukm4qUaJ11+MrxaOOLFQqPDdSXJ7v3f7y8GAAQ6eHzvdbIaIF5Okq3sm68/lf3q\nX06lv8z4jqZh5LTIyPd9MdqB9BXe5WNit36ZK3o/vvJnAICb5hyS87zUfYYRnahQJE84HACwMPgs\nAGCd+Oms9VLP2CaRIGt9uuomkb7Ey4Uyt14n24dwph/ZlJ5WflN+p4XlVcZW2V3dPkSiVLYmxQd4\nsrh2J0VBnvqR2EM7kpK/cEV4v7/0PcdTLl6ROjtz38tt71PPsg7u5XagVVZZ/8py6pnB+0XmU7s/\nWoxsPsS+UpqpAAAgAElEQVS3cZykKxImQ9+ar65/YjU1sk8dSh/16zs4/pn/zgYAyt/29cLh3vZN\nrYfZWdjKoWVkLSwsLCwsLCwsxiXGhtcCF2qDnO2olhQAAjKb3B6j1ey6HsYuXttOhuDMOvo/Ve2n\nMo7K0tT7qatLWe3LfY+rIxNbTHdu8ZeYxu9NPAsAcNEk6nDnBahlm+7l7PUeserTuOaP3HeH5CEh\nv2oRyt+QyWCYPMyHR+YiEYc58hvmX31o3t1yHABganCv3EPPY3k+1Uofb889SmZlJkY/drrbwj6Z\nx1tBH0v8zGukZnsjrAc9teOAgXTp8MI7xDL4IMm45DcVwUt95AbEe0FvRmQv8dLgk33K1karJSra\ntmz2cjxF3Nmb7MnaVuZVY8vrdixDz6f/a1tTBinZMXa1wid+hVqyzgRZrWXN9FF593Zq0S495WkA\nwDc+kG1L0JkkQ92SVAZOfH9miMq7hYXT6E6VIqKe5iO7tzLKMv7K5vcBANY1k7MOvc6KdetG7p+y\nY/T7i7xwsWP91e1dnyDz2noIy+z7p/4WANAUp7/Ql7sZUbL5b9QFTnzP2pz38YRYPuu+RdZ0zrXF\n9wqS9LN+6/dA2dPpEvEtIu9Zv4Hl3p6s7YBJZG1DvgWejA5V24eeE3URj/pdTelt5bvSleSJvVK/\nzgwzTT8YUk5HB3201ACMN1sbrNt9Il+5oN8df6cUoBax+H2PlksUvvjIaamHhVQbYn3IxcK6vx3O\nA2Rgg4eJRxTx+X9BHWMBPFAuHhE6OrJvdAzHIHU/aAAAvLazEtHPFWbcYhlZCwsLCwsLCwuLcYlR\n9VrgntV4J5DJPKmKfhF3JypSl7QmqA+s8tKSsCPOmW9LD/cfEKT2c3n3LABAbWBv1vkNEmViXpBa\nrpt2ngYAmB6iLiZ+2olwXizO7Hnad8hStH2H23dPpl615x1kVJo+TsbkhndQZ7ayk5aBN+8hQ7uu\nmyxzqVd1fQNHQ1F/mDpT3iMxr+eGyQL/cj198046903XlWS/xwIT65tMC+kUkeaKztUfA6tQ1lYj\neflFQ6x6QU8pyyXZVRwPFSOJigZhBOTdJgOi/6ZcEaWNolsTTxyR6vSsPtAqbUwIA68aUXuyIzqN\nR8TyadyQ7dsymaH5i8hKjLYT1f55u8buXP4Pj3E15cjj6XHk2jmMtvWFly4EAGz4J1nC+2ppDVy6\nVax9ldiX3l19Cjs5yA0jdUdcPabqRUzME3qns+KsP+tOAMAV9SfzmTPJBp++7CMAAO+S5UPIYZHh\njtnuqifmcPq73HAxvyuzj0r7/Fyy/80AgF+3k3F9rJXnNnbxm3TWJK74/f4ddwNIW2i7sf0q2jnM\nOWLL0PMxAHYdRRa0zMNf1bb6Jf9twoqqVwO1I2lPZjvTTkXpculgAaT6XK96LYCywLGsX4Wu8NV5\nyc5tjNDWYkuc9iDRxUcBAAKPvjyovI4GcrGsus8RFjFlYa9w1z1BXFzRHnsh13z//QS9Hsy9l/cJ\ndLB8fV3FjHNVRBTgdSOTuQaAql9xHPX6tzjOmVXKVY21vVMAAHvPZdsq30x298q7/ixX0gbikCB1\nuV/80AexZWth0efGbi9uYWFhYWFhYWFh0Q9G1WtBSosis53GK6mdODVMpvL53qmpS2p9nMGo1m1K\nkDO98jqJ9iOMbbVE7OlIcEao1sl6/RESK/yzj3PmXH4wZwsVfg8wQjLKeBN9L/rld2oP9VOhu8WP\nnzy40kf2WPOmFtaxHFSKapg8MnXWcyb6mc/2OPOv+Y68VF20/IwUnG7RcqkMJ99kMNd+t69Zgepr\nA+1i4T8OmFiFv0s10q6KqVphjVomhsEmY/KqVrK9E3mtEPQpJILjQDOcB/48fqiViVX/mMgoj7Q/\nzOwY8cnasasJLtm/FQCwV/wHPyNsYelStu2eRazL58yjRla1ku4VHO0bkhmNQ6OiKUOtfU08yXOW\nt3D1qP1BrhbduJCrRS810uf1IU20TJ6+fD0A9Vw6QnBpx1WHmuztzT7PxR5567iyteb7/I48dDxt\nELYlyFQuaT8wde4Xt58KACiTzqc2wO/IvzfOAwB0TyTTePavrgUAzAJZJ99MltOmS/n78lV0xH3+\nOZcBAKKn0h+v78nihUzU7kDtIdTrQEcyd4ep71r9yarnH/Xso+0l8zvj9gCifa6yuDXyXX1Tvrsz\nfFwBDRq2K9XOVnuYtvb/oZX+xEcLzGQxkYctHQ50zOJmZt1sbojDC/xr1QIAQN1hXCFFK7/LrXNZ\nR6c81Vm0tBUF+coss+9NeQHJzZr+o4MePjRy6SEhroDceBNX3BNy3Qvyvdf6ec0a9i0lGzfBcQrr\nny0ja2FhYWFhYWFhMS4xKoysWrm5Z9QT3+DouzmRHbcZSFta6izy2OpNAIDdwrwu79kPQNpCs9bD\nGc90P6dEb/RyxvxI11wAwJXvfhwA8MCdZ/D+/3wexilytBqZvXgk2ksqvzLL2RjlbCzgYl4TrvmF\nsq+JQkSiAjcrIyRvOmn9RLkZLThOfi3fYGHkXokx6MYwL1xRgzwxvvdde6jp80T5/gOt2fUgSOIO\nsVh6tiyEPEp2ZXtt8HVq4RamPRqL8LqWTrwu35aq1+tC+uUrKxUWsbD6t5w3bdfIJnYYOHEqPaqU\nSJrPrHwdAPCfJkb8au8Rf9Pih3pbt8SKFyvhSJxt3O9lvVK2FQAcofWMMLITQ2R3u+O850FVtCVY\n2k1Gdr8gy2nBZO6fU8aVrRWz6D0Gr7cPL7O5oLYUErFOiZ8+TKyg64JFAIAd72N5/eOEWwEAy3un\nAQBu20XWtUe+L7PCe1LXvqOMDjzV33ZThL+XLqBP0Rf3zgIAXPIe+uVefAlZpaYEGenbt5wMADhv\nBu0hvGXbAAChVr6TYiog/S7yTut7mziUbndYt7XOB1xt3ZPySFD4qozHFSUsbPhBUe1stZffm7Ux\n1rWA4Xmt4jmjPDiKKx8j+G3L57UgeRJXXWtf4Zii7o4VAICWDy8EADSdx2+/NF1gzaYRS+OQUEiZ\nDRDl7slDuAx4+gqOxU4r4flHfPMaAEBMop395CqulEz38UO2Zwm1tNNQeJlYRtbCwsLCwsLCwmJc\nYniMrM6YfZwJGq+Miz1iBdkr4gfXyD2fP78f/Ywz6EaJ4tUk0WSAtPcB1ei80MOZrup7an1kBNqT\n2ZGpNMZ6zKUHuq5mHQDgj22nD5TLoUNmNUmX7zX/Cs401nfTSr9EZrN749lCRtXOqg421/xHWSjN\nn96jzJf9zEC7O+SVMHMD+MHbl3DrjYxLC9rn/AyiId85jrA5KclXgTHTRwWutEWqWB5VldSftXRz\nO1LN9qNv2DTLCkc4XSDeCp6TjLrobfFa0DGD7UJr3HjwH6vwuDSyqufzuJgnb8Z2DCwHXanoFfZq\ncR31pY+iAmMNPvHt2hLlW1Jdb6Cd+/0lzEtcKn9Azg94xS+o9Bt6n7hJ1wVl5eLSb/jlnDKJjKjl\nFN6d3T8cUE6df4rZnsFyC70+9Hzmha7Q5Omjtnydvl//52LaVJwQ/hGAtDbvh7vomUYZ2EUV2dEb\nVVsKpPXDWpfiIq5/tY1s7ozSvVnXXr/+fABA8F0NsoeM7ob/IyN71/sZCexvrbRSX3UlNZJ4JV9m\nC8dl//0IgLS/4K4k7R9qZAXz0ABXJfWboDro4UBXRFsS2X7YqzXSpuglNybo7kKjWm6XJbElB9My\nfbEhUzkWVgCHA7d9j2LTd/n+YxNYXgfcKuXwSa6ihPYw35P/QE8k8QNmAMi/yjBmkEMzm/IfG49l\nH5NzH2qkjny9rBQurueKSS2yvUO1fow6a/WEMetX9F4wmJGJZWQtLCwsLCwsLCzGJexA1sLCwsLC\nwsLCYlxiSNICN62eCk1WoJP1nnNJsze+j/T7hw6noL4pXg4AeEWCGlR606EoS8Xdhy6vbY/SUbVK\nBdTt1iSRGKhh1DYJaatQicLWuLjpei+FyFX3FZb2ocAd+CHRzme3iwygys98dovyW5ftdGlQJQbe\njLV0jysEb0KWdvaKB+YpgTY5j9eYxNhfyjGl4j1aVyjUr7msaqg8QGUE/RmFOSp7cbJv4ikR1z1j\n0Q2XS+4QbmKd37m6BgBQsY15iIcl9J+sRvVMkiAHGTKCwBaWpboyi7FpoaSJ53bXj/364IY5ko60\nKz10Lq5Lp2osqUiF4MxoL14nO+SmGnsdFeZy86M4bKSSPWSkJBNGXeyx3w0288WHSsRIVJbBVUKQ\ndLlr0+3MABHKYPSIcVfMz3uozEkNxkJb2T82xykh0BC/6q4rWiGO8oeayRxInELXiFvexXfkncv+\nskQMhg6dRIfpC0PPAADWdE8GADzVQvdk+4kD9ipxZzi3hNerEe0OiShS7k0v56rUQiUnWg4x6Wya\nI1wyb4myXX1tDuUM3g18NzPlu/NIF5/9q92UPdQFuf/NqyXCxFWDKYncuKhcDIekeqs7LTW4+lMn\nA2XUi0ssb0qaNnyXe1pOrVIPZvkZUEhDpuszglJ3w2KI9lAn+7DxLilQpII4HURjx83fZHmUeGmw\nFGvmt33jxRx/VK6XdyARsZP70YjSE5Ex1Egn2BWECiabw0wZfQ9CcpfPUHzhK8zTpRvfAwDoOnF3\nzuvVjZ5KCv7URld18a3bCk5D6l6DvsLCwsLCwsLCwsJiDGBIjGw+8b1vCmfGsf1oxNRyIGev3ZM5\nGzjs7NUAgMvr7gGQDkGr7kMaY5y1HR5uAAA82bYgde9mH2e0ytIeW0pjrdYkn6Gzz+vWXwAAqAuT\nSbhrJoXxMWFk1sQ4y28TFuNTC/4NAPgTagvK+1DguB1Vy6wnKrNaNTRQ5sTtjDomLEEoR1xRT8rl\nUDYbk2KrZL9xe1vK4zx7VKGCctWVu0LUps8r/JaOyzAoNSMdB9h2Eut2WQO3KxuELeuRsIatpFvj\nVazTvdX+1LUaTMEb4bmdUwPIxN5JPK4O3eObJVznGDaGazmE/cU/u5nfzgRn9OWenqzzdIbvNv4C\n0u2kRVZDjguKq6qz6RYn+MjSYid72Eixn9KmfVvoCqs8VJrzfGVw1QgsJEytL8NcVBlXZa2jSTWG\ny+7bjRjsaj+Tcu2lfZe3eIE1olNK0fjRY3HE2TTAOzhIplGN9jTIS6kYsu4UF1matvoSrkKpm7HG\nXrJh6x327SFhLNWQqzqQdreo95jg5z41dqsN8LfGzxUcZXHXRfit0xXCN1JMP9vZREn7rFDzEEoi\nN7zzyLRO8XFFYlmEDHW9rDIqSxoV5l77fmWV09vZgRRKTTTreCY0f1HX96RFAiHs7yfj3CH9xe44\n3UrN8/NddMm7eLew5Hdi9qDzXSjyGWAN9T6ZrKWu5CXaxc3c0TQoTP4/MtLdG+kyavJUjkMmf0xC\nwbvYSnXL1Taf45kJT3BFaNi9rdsYK0+45uGWTRZc34guCZn9x/WsG9MvWJF9vuvbYgJsK/U+1pU/\nruaq2Gy8OuikWEbWwsLCwsLCwsJiXGJIjGzkLLIXk77C2cRhFXQ9sqDkWQBpnZEyiKt6GCJQZ6vr\nopzNtomeU1mBXVEK+W7eRJdYTxx9R+qZX91+JgDAU8KZxR5x83F+mTri5jOvmvE0AGB2gKzFw12c\nKW0XrWydzBRn+anbeH/5WgAjy8jmw8kT6IJjlTgdVzYk4XIF4+1Dp+aHXtMhbJUyDcUIMjDi8BWY\nSJ3k5iCD3NpYRxijVP4D/r4XjTZcM1Xv/gza0XMA2Z9EAxnIaBXTHqnm+eUb+Y7Va1vXzPQM2d/G\nph0r17mqK3xnp7jLuYKM7IwbGrPSMBbRfDKZI9XhpduH6M9UBy0MXjLHPF2ZNtWL/qaDDFLLx8mg\nTXlkRJI+JLi1rqp11JDXId+MrPOUadQ2H0mwDviMlkf6fslEdtn0injPl3KWL/1GKevYWtGhqu5U\nkSiiODa4O4JZP1uHbUtZ/18+TtrqAXw3h02ldm5mCdm9BWFqZVP2E/Ld0RW+hWWsH4skNGZM8h+S\n+lLpSfc3YROQa7P7oC1iS9Eo3ypdAdQQrLqatls0xJXCjm6LUIer7hCn/0PuV1hR5ETT6XVZ273C\nqFbJd6Mtzvw1iyD+sBDdGGmABP2uKBPr1swORkOr5bA90Sv3ZLnpdzcs/fBu1XWbke93+7CN7lDW\nBepzc4WfVSZWWfH1n5O+5lm2wdojybxXnLWh/5trUA/9LrUVKZBIPiY2D8xCMsprruQqx4Jvsy3F\nG7dmn+gOD12aXgVSO5N1P6FbrTOq6YOv4czsFbL0BS43rKKxDemqcUO261QYU7B42DKyFhYWFhYW\nFhYW4xKDY2QNZymLvkMd2WnlKwEA3TLj0xnxdpengEqZxUdifJyGAVTMDzLs4XkV1EY8fStH+Mf3\nfjJ1zoZTqat9ooczBJ0BX7yJYQeXbyGzdMwsBhs4pJyzd2V9VduUCl8pM+oXessKzv6Q4eRmVFV/\npKj0cSaj5ahMrEdmV56M6UnKk4Fqs2RGrIEQ9saYb2UMEn737HQMhihVNlUmbm6vBX2CHuSYraWY\nWI8rv7pZI3WzeQ/GDFwz1cb3kiUsEZlVIsQ8BWTy3j2D7658G39bDpBmnPFKw+LhoPVgXhvapcEU\nxGm+hLntqRf24XB6BHBeWTn8/IwQLjx0GQCgQ8JSK7uq7GEC2UFPciEg7X+ieDlpkZWd6w58DABw\nH6YXO9kjhkpxfK9aWLeO1b2Sk8Xwyr+JlD6f53bG2S9qgIREKZnKJZvJkl4y/2UAQJvoVZ3CSbzC\n4DEoeZH2DzMfzY6r3RZmn/bsQVwR3HsA313HTCaidwrT7AS1A9F7SkeRlDDNe4R97konPtgiv63S\nXloTsp+rAN5O0Qp3ZLNNTki05272bzuZyTWtrG8lzkv581wg3NVaVyX9AfFyIx3mghJ++zQ0bYcG\nvTDZWmvVu+rKRldGMCG3nYaem5RQCK2ikd2dKM/aPjQooXmF2e5ysrX5+xSD9ZDgYjNz6UnXf4tl\nnmhifv0HsVOecM66wh4htim9E8WTyHADIRgDEwzCSNqdhKykiCcpZUt/dc7tAICnOg+UC1kfb6tk\nn7rkJLbv3x84Ofv++m2S+2d6+9GVw6+c/hcAwIMXnyJHaAvlKWfdSHbQXqkPu1vHVXDVcNc/62bU\nC+dZLSNrYWFhYWFhYWExLjEoRjY2qRTb/+to3FD5EwDA/S3HAACmhzidnRmgTuTQks1Z15V7OOvY\nv4Ij7oe7GPZvSesBAIApfvpee6Z7DgDgtzf8HwDg8s9+PnWPdz5yNQCgfRbH3vFSzmwqDiWz9tXD\n/w4gPXPUGWJ1kDMI9R+rUBZZLZ69+8+FaXi2sIIoElTLpNpY1RAHZeasuiNlXzOZpjZhpVTXFBaH\nocrANiWzWe9oVbGpk+LDCZIpSfmJdSc5nxeDfpDyn6u+NMPBoSdwH6HrIL7L0pVMq7LLCU16QJk2\nFlQu/bPO/I2wUCIjRMlUMpHxDtYPXzsv7phLpqGsCCE0RwrnV3El6I1esqYpH8qu+bh6LUjki1uM\nNJurPjhPKtkBAPh1mH4hk93duS/ch2js4erB5BBZH2XUFDVBprEjnq3XjLsWW1KhrjNClab8ULt8\nz6pfWT2udS+ylfUjfACZnr0O+9diau+deByJnbvgrWL4cd/sWVlpSKV9F78XNeup55so/qedSHaY\nZaOae2Xm1J93WIS9GZp87XuSAe5LiK/maAV/45NFp15O7assmqVYUnEYgHhY9NsdDBvrjcl3apMw\nb88+2E8J9I+6f4rC9pvyTKjmVXzgOtka4S7ZVuZW24VeF5aQtqpRzFwh1JU+N3ur91Dos8LSwZTL\nakC3hmdPtcF9sALoYlS9dVzZSk7nb9d06jvDf3ox9/X9MLjrf8ixjkkwn9MXcBU5HaLYlRR/NhOd\n8rXvk9WDmiJ5DXIcOJFI3k/iAQdTH35cSFZmQbucgPhJeK5nFgDgmBKuZN956XkAgKr7ssPI5iqb\nWb9m+7vxhXMAAPNfW5Z1PMXE5kFkBtvINlldH47HGMvIWlhYWFhYWFhYjEsMipH1xIDwziQebhd/\nXyW0/Fdm8dFOWsJNK6EvNfX5Olc0sK/2cjb7z93U49WXkGnYGeMMfE+MMyaNuvOLH9ySevbNO+nJ\n4Lzq5QCAQwNkYlvFT90q8YTQkeRsW2eXbQnVyDItarGpkX6qZFbafkgNEjuH5MRhyIjloTNU25Z0\nHc/ULXlcc7CkSyen26oFjrusi/v4th0DcPwadUS2NftDSKonnn1Riswew1M3z8FcofA2cTavDKy4\nsEyxPhDr5HhJdmZMPM1cqTzSSbG3LMzeHt47WUsmJdjEm3bXisZ6+NkoOnyTaa19pLBlz3ezMlcL\nm6reCtR7gdb9TIYpFSVLmKEqLwv1+pffDwD487HUkPWczL5pNP3JasQbt1/p9ZFs/Zr6U+2KZ7M/\nmv+wjyyQ+qvOZGQV6ltVz0lIf6osruPndukW/paJrUFEKMmkW3tfBCRaRRvb2pbzuGrvTFDyrVrG\nKu53SqSOB7L7c8cnKxjC8Bo3dQ3A8fIc1doHWlmG4QZh6FWLKH2Vo8/Qe8kzdNvTwesS6zflzMtg\nsPWCmVnbuurYmuSzjhZW+ble9SvL48qmqncHXalQW4xWaRP+DG+mCdcqoDJ4ul+/p2qroueFpHx6\nnWxGd58wsi7WsPtIllf7DPGc0C5MbQXTnPIJmwfqoQAAjjyKGtgJ4nu44eg8lvmptIhWNZGtNdZi\niE2LohhIVoXRc/LRqTxOufs17hct67E1G7POfzNCD0kruuhJSiPWbS2nD//PfuW3AIB77suua4r4\n4zNS/3+yludu/iqZ1cF6qI1MEJuq+IScx43HFFxtxvBn3cLCwsLCwsLCwiI/BkVBeqNJlDdGUkzB\nk81kkOpC1EIcVk49hsa+fqOHo//l4u9Q41dXBjirV0Zhop/X7xekpafOIJf2pkf/19QuAQBskdH7\n37oYV1t9sE4QzwhvtHO7W1gK9aXYGydbXBnksxdWU8e7BvQzu/tQD+LPDaY0ho8Uw+oiNfJp+zI1\ncm6LZLfvWX1Hym7Hw2OPgXVDdWrpHfxJsYtDmHYpCaWMbLxc4rcPIX0jja45ZApS3hqkdSaEeEpp\nZEX3mnS13mRVun54ROsIn/rTlc3NZPuc2Wwvzm6JBlQpxyU6X3xH07DyUky0HTcLAOAVK9ZuKYha\nH/uNRIq5ZP5rhS3K1MWn9eZyD2kXx8+m38ewtJs9C1hu9aPoT9ZJ6QuZL+03n94zT86gH1nV1it7\nGnc1EI9LG5u5iqPnxtXXrEdXcoRRE7YuWsnj1WuYBmX1UoztKEjvU9o7twSvwCrbX5JNnnOG6l25\nmF6ZfadlRwlT7x0tYluxn+z/zI2fAAD8VWxNKj08vimeHemrVbwU6MpFZmQvZV6V3Y9KgdSITYm2\nsflhrqJeseUEAMD7ZjwDAFgdza0x983iNz3eMESPusbk17K6NLK6quL2EF/wO7kz7VHgw3XUjN56\n+Qf4qAGiT6U8HrgjS8pK6BFzOP7oX0U6MBJBg7bZPjz9+ZsBAI9/kqtXm6MTAQCnlzFK3hZJj0ZD\nfHcV0/+uMNt1xOGv+vv90h0XAgD2/zmZ3d7v8veeeb9OPfu/Vl8KACjdls36ForOKeyT1/fW5Tzu\nJB3rR9bCwsLCwsLCwuKtjcGJQjt74HnqFfzhseMAAF879w8AgKfE+8DDTWQ926PCmIQ5iq8QxrVa\nxH7qVzYkDIpGP4l4OBvQ2WBTpDL16OeSZCNiEr0mIr/KVrTIDETjbXeIKLRBrEeb26gF6Q0zy88m\n6CHhzMn0m1myy8BTxDDEWRjAn10+v5fKsrr1sEDa6lqRtkxWX5JqiSrxp8ciBelCIqhWxvxJvQ+T\ntbsgKDmlJINHrIdb57Fu1iwZcjJHDElfNsslpAeEeEHSL54IhB5JkfJSMIHStO4qxchGs/3F1ixn\nGdccQ435+p28eVJd/E0SvdIYYmS3ncWXqLHlO4WRVZZVY8vP8pGx0tm5eiQBgEle9kFro5z9dwgb\n9c5KMrLqh7lzQXG0a8VA0rXK8uZOWl/PFEbWvfqimliNzhX0iveTZN/G79bSR1NRwbJbWW+l1JdX\nW+WZvGeqTxr7zlDeMijxs+w3xagNny52Im5bi+q7yR4eu/BzAIBbz7gPADDbR+9ChwXZfp7o4cur\n8fRlT6NQ/8L8bRfbk/3EZ21Evmmf33EEAGDFnQfzwhvJyMbg1qnze7XlA/RYVH/TEBnZ/r6l7mPC\nhgaXsM2fUEOd6/23LwYATLrt+Zy32XAzPRSsnn9bat/8f1zF3+deHnyaM5Moffz8Mq4+Lxsml+jf\n2YXJP3geX7nkZADApyY9CQA4JEgvLL1SN5Z0zwIATJM6syBAO6ZlEbL1tV7xRQyuuGx67518wHv5\n81KE729nIu1rOPytbM9Ibj+xA0FXAdd3KWfekn3CIKJMWkbWwsLCwsLCwsJiXGJIZvqzr+OM76ev\nX8Dt/6ZvsrMmrwAALG+nDmaLsKGviVbWLzqssJ+jf7WYDXjVoli0YTLNL/Wm2RHV06pfWI3U5XFp\nRdX/3UttswAAdWEyMXMryNaoNkyZmLs3HcvzfvI8GpwujAjyxD9uF9Y4HMjNAulMWxnbXFbY7tm4\nzqDVgluti/tGxRp7kb06p2e7Vkixqm6tbD/eDFIWyaJFUnZT2d1wczFVa8VFT42wIAGmXZyCYO8C\naRcS4cvXIT4BRTureassSzOQiQBXOTy9PFf9HjqPkNXb0SFRV8SrgVMlUZH8Y4+6nz2L7MVsHzN6\nYjn7G2UHX+uhhe2JUn0WXXctAKDqV2lfiL9ppAC+3tcAANjoii44TXrChfNpXZ7bXn7fQvvBVFvf\nWpp1vFWi961v4WpUR6ew64lsmtRJSEPypBuMMdmMqnZR/gDLtEqss2NlcmA9GTTtX1Vn6dZpW4wc\n9DLTcd0AAAk3SURBVO3t5+fq4qpY/0uI869h9KYf44Ccxz2l0kdUyypMpr9e9WqjUa4kAtXNfSIi\nsv+ohrS1G/mj9UQ11bsS/LZOXkw7GtzUb9JzIllViu5TF8Eb4TMDbfwu+naJ94F2MtVON/vBZCe3\n2yPsGD5cQYv+to+x3bzy8CwAQHwz09RxEZnYB9//IwDAFZsXp559wP+syMjtIOD65uv3qVUijgLD\njOwleG47FdI/qGde/95NulNXpU4oaQAAqJORzfL8avHxr+7WtT94Pcr9LQlNJ1n8Z8U2CQDMcy6d\n8ABjCo/4e1aNe6ySD13TzG/SJGFktV5mRhEbCJaRtbCwsLCwsLCwGJcY/Hza401pFyp/8wIAYM9v\neOjB8zmDWfRlWgu+exZnQAcERNMl85mQUGulnmyfczqqfraHkXsyI/Y8uZcxgltjZB12dpNR8Xuz\nGTZ3hJq2Hs5QvMJG9C4he7FpFWeplaPoL1LhF0pN2dNU1B1XLGxvBgWpOmKvi5bU/W5d7XjQyPp6\nhXkU4llJo5TET9kjeeW58qSRdPQaZXGVWfI1jF1GVuNvK3NWsodpba6QghAPBL4miT4kzG1wL387\nutOMdjjPFDXQQRajs5WzY4385XRLbHSNfjM8KVhRsesx6upa5olvTulHVENe58/mTwOdfZkBjTTU\n6qIQdZWjWfw9Ln2TzMZ8uJmnfQeNm+5uw/7ObKa1yk/WNBwQX7Ah5m1aFfWs6rElmuC7zSVnVU2s\nV1bLmjv5/qdINLEXJ0t76tIIifxV24Sky9GIxcih8jIyjJDoe1O9rPd+6eQizuA+5/pOB8N8DYTf\nd5IJPDbEtK6Mkj2ukVXFzS+xLe+HxkHfOxEE2md50TlDavJEfjdLxRNNTPzQ9+6VflD6NrOdbfuk\nPfTm4FvJ84Lv5mlti6jRPGU+WdfPb6DFfuALaa/ayV5a/3vCwioOMfKft4vl8NhT9MU/By8M6T5u\n1N7EPPv/wLZ+VpgaWI+MobYIeb9GfPa3JlgGMfHFrdFXy+U9pcdq3J7pI7P7tRtOSj0zDImQVqA2\n1rg8OCSC0ic3s5wn6XnewQ9WLCNrYWFhYWFhYWExLjF4RrafUXfpQxyhr3iI2yvEs51ZSNO3nslk\nU4N7qJvpmMntig2cEXoi4hfxtdU57t7p2iZjkNveH9BYN24fcsDavOkfMeSxtFzWTOZ5+jRqQ7pF\n9Ki6V/0t80aytjP/V1YqIkxT2DWb0eOO15WGATwpjAbKn+B73zufFrCRKmFRXUFU0rrXDM1fnux0\nT8628A+92gCguP4di4V4qbBjYk3cO0HfJduFNyQW4zGJXKRxu7nIgN49aYvSQKmyFpxpL5hAjexL\n8+g32UlKyxH2V5nZaLlEhSpOloqC+ptoXTznM5y5e0C2YWmE0WncOnGTI2rd0l7q9HV1SK2w5/j3\nyC/vfeAt7FdGtX74SXNqxK5u8RPq9tn6u38eDwCIVzC1wWaWwyav+CN2ZSKzmFL30lUOaR8aHe4P\n7bRGn7Ys+yYaKVAjgQ3Ft7PF0JDYSa342aeRMfzM3/4MAJjnZ3tYuPQjAIApyPX9zIAwaMp8GYlm\n5uT6JrjaUipSlY4DXPYfX17KSHmvn/QzAMAcP4X+56w5DwCw35fSuvXBQi3088E3lW08OpteCnpr\n2W46prHOOoa/XdOFbTya5Ta/jGOLZ/5Nr0tz72WaE2tW9XnGUJlYhbeL9jB/uYBeAT73hXcO634K\n1asurifT2/5B6n1P/CIZ3+/V8fgcv7Znd1SzgOs3Gx9r5Gp7+I8vDjmN7ihnhx+1HgCwele2H9mc\n9XAA2G7IwsLCwsLCwsJiXGKf2Jw6S98AAIRc+ytck6uxZ0c/spheTi3bdD8Z2bCHs7WFJYyUEdAY\n2EKXVHry80TdQrGEhJr8Wyc1xVNlth7ezzUDG6TPt30BjX09/VZqq1vP5Qy5ZyLnWyKBSrFAnkRf\n1Z/bf2xFg1jV/nVV1jPGIlLRtjaTD427GozqGdWVnzjuQP1zZOw3fjBdHioFnbCEN3nMI5pwKZ9w\nJWnunm4ykaWbxV/o38jmjJ1akca7LrwcAPDYH+6VPdsApCMbKZvQPUl8TGdce0IJ/SpO8ooG2JDd\nUgvwYz97NQCgfFVxNGvDgaeMadTofSmvBZXZPeTs64fObg0VGhlN9btqeWyx75BYTX+oGrlO6/Bh\ndWwPO+U8bxX1kIlWlw8O6fMd/c23rFkAjE+84sTEE9EbbHWdJ6q2kue1/ZyrjxXSZkcC8W3bAQAe\n+dVVpYFWl1LeICRtI9n3JVbS48p7/voZAMA8DJ3h7A8VD7Afe/UBbi8GmVpz5EEAgJ2LRCt7MFf5\nyqaQlZ5aybriyHhiw04u9825JEckM2XjCxxDuNnsHT+mL/+Zr3NVTO/i9LiWYAuAZWQtLCwsLCws\nLCzGJawXwH2BPH5kX1zBGclLQYmS3SazW7+Lm5bphrczY96hIjdh6VTbplpRDfwVFcak9mUXezmG\nmNgUpJzUirbifs4q1eOnb8pkAEB8Ju0bIxOC6Usl3yWNZFydhq1Z90rlNs+7GAuYfSnZUGU3lDWv\nlXflOZQsu7OK55n9ZwMAkiveBADMfyL/vWvucu24M/d5Y7BWpODWgfW+52gAwJ4F7MZKTqCv6Lon\nyL5metlc9AgZkNJasgJlD9GPrnpeKS+S9XAxEJeoams3LAQArN/B+l671MU7uKyA90Wd/tyjHwIA\nTJjJlZ6Jr469dvSWh7z3j/3o0wCAUAvfQdk2ieyGZQCAZNfgma1Bw+U7NLSbaWkSTxmtokU3b7fl\n1gEw71Mjw8QOBGcZI5lOYhVJeQpIHXdtz8HWfm42yLbvOr/sDywD9zfHiQ8+xKplZC0sLCwsLCws\nLMYlzGAsxIwxuwFsHrnkjDpmOo7T19FBHrwNygMYRJnY8siGLY9s2PLIhi2PbNjyyIYtj2zY8uiL\nt0GZFFQegxrIWlhYWFhYWFhYWIwVWGmBhYWFhYWFhYXFuIQdyFpYWFhYWFhYWIxL2IGshYWFhYWF\nhYXFuIQdyFpYWFhYWFhYWIxL2IGshYWFhYWFhYXFuIQdyFpYWFhYWFhYWIxL2IGshYWFhYWFhYXF\nuIQdyFpYWFhYWFhYWIxL2IGshYWFhYWFhYXFuMT/B141j1KM1I3PAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x51bce2db38>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X, y = [], []\n",
    "for i in range(10):\n",
    "    X.append(x_train[i])\n",
    "    y.append(y_train[i])\n",
    "show_fashion_mnist(X, get_fashion_mnist_labels(y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.5.2. 读取小批量\n",
    "我们将在训练数据集上训练模型，并将训练好的模型在测试数据集上评价模型的表现。虽然我们可以像“线性回归的从零开始实现”一节中那样通过yield来定义读取小批量数据样本的函数，但为了代码简洁，这里我们直接创建DataLoader实例。该实例每次读取一个样本数为batch_size的小批量数据。这里的批量大小batch_size是一个超参数。\n",
    "\n",
    "\n",
    "此外，我们通过ToTensor实例将图像数据从uint8格式变换成32位浮点数格式，并除以255使得所有像素的数值均在0到1之间。ToTensor实例还将图像通道从最后一维移到最前一维来方便之后介绍的卷积神经网络计算。通过数据集的transform_first函数，我们将ToTensor的变换应用在每个数据样本（图像和标签）的第一个元素，即图像之上。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 256\n",
    "if sys.platform.startswith('win'):\n",
    "    num_workers = 0  # 0表示不用额外的进程来加速读取数据\n",
    "else:\n",
    "    num_workers = 4\n",
    "train_iter = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(256)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后我们查看读取一遍训练数据需要的时间。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.22 sec\n"
     ]
    }
   ],
   "source": [
    "start = time.time()\n",
    "for X, y in train_iter:\n",
    "    continue\n",
    "print('%.2f sec' % (time.time() - start))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.5.3. 小结¶\n",
    "Fashion-MNIST是一个10类服饰分类数据集，之后章节里将使用它来检验不同算法的表现。\n",
    "我们将高和宽分别为 h 和 w 像素的图像的形状记为 h×w 或（h，w）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
